package br.ufpe.cin.ip.biblioteca.repositorios;

import br.ufpe.cin.ip.biblioteca.entidades.Funcionario;
import br.ufpe.cin.ip.biblioteca.excecoes.FuncionarioJaCadastradoException;
import br.ufpe.cin.ip.biblioteca.excecoes.FuncionarioNaoEncontradoException;
import br.ufpe.cin.ip.biblioteca.excecoes.RepositorioException;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorFuncionario;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorFuncionarioArray;

public class RepositorioFuncionarioArray implements RepositorioFuncionario {
	private Funcionario[] funcionarios;
	
	public RepositorioFuncionarioArray() {
		super();
		this.funcionarios = new Funcionario[0];
	}
	
	@Override
	public void adicionar(Funcionario funcionario) throws RepositorioException, FuncionarioJaCadastradoException {
		if(this.existe(funcionario)) {
			throw new FuncionarioJaCadastradoException();
		} else {
			Funcionario[] novoArray = new Funcionario[this.funcionarios.length + 1];
			
			for(int i=0; i<this.funcionarios.length; i++) {
				novoArray[i] = this.funcionarios[i];
			}
			
			novoArray[novoArray.length-1] = funcionario;
			this.funcionarios = novoArray;
		}
	}
	
	@Override
	public void remover(Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException {
		int indiceRemover = -1;
		for(int i=0; i<this.funcionarios.length; i++) {
			if(this.funcionarios[i]!=null && this.funcionarios[i].equals(funcionario))
				indiceRemover = i;
		}
		
		if(indiceRemover>=0) {
			Funcionario[] novoArray = new Funcionario[this.funcionarios.length - 1];
			
			for(int i=0; i<this.funcionarios.length; i++) {
				if(i<indiceRemover) {
					novoArray[i] = this.funcionarios[i];
				} else if(i>indiceRemover) {
					novoArray[i-1] = this.funcionarios[i];
				}
			}
			
			this.funcionarios = novoArray;
		} else {
			throw new FuncionarioNaoEncontradoException();
		}
	}
	
	@Override
	public void atualizar(Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException {
		Funcionario retorno = null;
		
		for(Funcionario f : this.funcionarios) {
			if(funcionario.equals(f))
				retorno = f;
		}
		
		if(retorno==null) {
			throw new FuncionarioNaoEncontradoException();
		} else {
			retorno.setLogin(funcionario.getLogin());
			retorno.setSenha(funcionario.getSenha());
			retorno.setNome(funcionario.getNome());
			retorno.setMatricula(funcionario.getMatricula());
		}
	}
	
	@Override
	public Funcionario buscar(Funcionario funcionario) throws RepositorioException, FuncionarioNaoEncontradoException {
		Funcionario retorno = null;
		
		for(Funcionario f : this.funcionarios) {
			if(funcionario.equals(f))
				retorno = f;
		}
		
		if(retorno==null) {
			throw new FuncionarioNaoEncontradoException();
		} else {
			return retorno;
		}
	}
	
	@Override
	public IteratorFuncionario getIterator() {
		return new IteratorFuncionarioArray(this.funcionarios);
	}
	
	@Override
	public boolean existe(Funcionario funcionario) throws RepositorioException {
		boolean retorno = false;
		
		for(Funcionario f : this.funcionarios) {
			if(funcionario.equals(f))
				retorno = true;
		}
		
		return retorno;
	}
}
